package com.linghang.association.websocket;
import com.linghang.association.domain.Message;
import com.linghang.association.mapper.MessageMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.SpringConfigurator;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
/**
 * @author LinyaT052
 * @date 2022年07月20日 14:32
 */
@Component
@ServerEndpoint(value = "/ws/{username}")
public class WebSocketServer {
    //日志记录
    public static final Logger LOG = LoggerFactory.getLogger(WebSocketServer.class);

    //记录每个需要推送的信息
    //第一个参数为需要推送到的用户名，根据报名的组织id查找对应管理员并推送
    private static final HashMap<String, Session> map = new HashMap<>();

    //获取会话Session
    private Session session;

    //获取将推送的用户名称
    private String username;

    //注入离线消息类
    @Resource
    private MessageMapper messageMapper;
    /**
     * 连接成功
     */
    @OnOpen
    public void onOpen(@PathParam("username")String username,Session session){
        //每有一个新的连接，就将连接信息放入map中
        this.username = username;
        this.session = session;
        if(map.containsKey(username)){
            //如果已经存在会话，则说明在其它地方已经登录，此时关闭先前的会话
            try {
                map.get(username).close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //将新的会话存入到map中
        map.put(username,session);
        LOG.info("用户{}已经成功连接",username);
        LOG.info(map.get(username).toString());
    }
    /**
     * 连接关闭
     */
    @OnClose
    public void onClose(Session session){
        map.remove(session);
        LOG.info("连接关闭,,Session id:{}!当前连接数:{}",session.getId(),map.size());
    }
    /**
     * 收到消息
     */
    @OnMessage
    public void onMessage(String message,Session session){
        LOG.info("收到消息:{},内容:{}",map.get(session),message);
    }
    /**
     * 连接错误
     */
    @OnError
    public void onError(Session session,Throwable error){
        LOG.info("发生错误:{}",error);
    }
    /**
     * 发送消息
     */
    public void sendInfo(String username,String message){
        //首先判断用户在线状态
        if(map.containsKey(username)){
            //用户在线则直接将消息发送
            try {
                map.get(username).getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            Date date = new Date();//获得系统当前时间
            Date time  = null;
            SimpleDateFormat format  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String nowTime = format.format(date);
            try {
                time = format.parse(nowTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            //用户离线则将消息存入数据库
            Message offline_message = new Message(username,message,time);
            messageMapper.insert(offline_message);
        }
    }
}
